<<<<<<< HEAD
package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {
	// 配置文件的默认配置！要求你必须给出c3p0-config.xml！！！
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	
	// 它是事务专用连接！
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
	
	/**
	 * 使用连接池返回一个连接对象
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		Connection con = tl.get();
		// 当con不等于null，说明已经调用过beginTransaction()，表示开启了事务！
		if(con != null) return con;
		return dataSource.getConnection();
	}
	
	/**
	 * 返回连接池对象！
	 * @return
	 */
	public static DataSource getDataSource() {
		return dataSource;
	}
	
	/**
	 * 开启事务
	 * 1. 获取一个Connection，设置它的setAutoComnmit(false)
	 * 2. 还要保证dao中使用的连接是我们刚刚创建的！
	 * --------------
	 * 1. 创建一个Connection，设置为手动提交
	 * 2. 把这个Connection给dao用！
	 * 3. 还要让commitTransaction或rollbackTransaction可以获取到！
	 * @throws SQLException 
	 */
	public static void beginTransaction() throws SQLException {
		Connection con = tl.get();
		if(con != null) throw new SQLException("已经开启了事务，就不要重复开启了！");
		/*
		 * 1. 给con赋值！
		 * 2. 给con设置为手动提交！
		 */
		con = getConnection();//给con赋值，表示事务已经开始了
		con.setAutoCommit(false);
		
		tl.set(con);//把当前线程的连接保存起来！
	}
	
	/**
	 * 提交事务
	 * 1. 获取beginTransaction提供的Connection，然后调用commit方法
	 * @throws SQLException 
	 */
	public static void commitTransaction() throws SQLException {
		Connection con = tl.get();//获取当前线程的专用连接
		if(con == null) throw new SQLException("还没有开启事务，不能提交！");
		/*
		 * 1. 直接使用con.commit()
		 */
		con.commit();
		con.close();
		// 把它设置为null，表示事务已经结束了！下次再去调用getConnection()返回的就不是con了
		tl.remove();//从tl中移除连接
	}
	
	/**
	 * 提交事务
	 * 1. 获取beginTransaction提供的Connection，然后调用rollback方法
	 * @throws SQLException 
	 */
	public static void rollbackTransaction() throws SQLException {
		Connection con = tl.get();
		if(con == null) throw new SQLException("还没有开启事务，不能回滚！");
		/*
		 * 1. 直接使用con.rollback()
		 */
		con.rollback();
		con.close();
		tl.remove();
	}
	
	/**
	 * 释放连接　
	 * @param connection
	 * @throws SQLException 
	 */
	public static void releaseConnection(Connection connection) throws SQLException {
		Connection con = tl.get();
		/*
		 * 判断它是不是事务专用，如果是，就不关闭！
		 * 如果不是事务专用，那么就要关闭！
		 */
		// 如果con == null，说明现在没有事务，那么connection一定不是事务专用的！
		if(con == null) connection.close();
		// 如果con != null，说明有事务，那么需要判断参数连接是否与con相等，若不等，说明参数连接不是事务专用连接
		if(con != connection) connection.close();
=======
package cn.blueboz.Utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JdbcUtils {
	private static final String DBCONFIG="conf.properties";
	private static Properties prop=null;
	static {
		
		//get config file by class loader
		InputStream is=JdbcUtils.class.getClassLoader().getResourceAsStream(DBCONFIG);
		prop=new Properties();
		try {
			prop.load(is);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		finally{
			
				try {
					if(is!=null) is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					throw new RuntimeException(e);
				}
		}
		
		
		//load driver class
		try {
			Class.forName(prop.getProperty("classname"));
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
	}
	
	//get Connection with the query which was gave by conf.properties file
	public static Connection getConnection()
	{
		try {
			return DriverManager.getConnection(prop.getProperty("url"),prop.getProperty("username"),prop.getProperty("password"));
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
	}
	
	
	
	public static void close(Connection c,Statement s,ResultSet rs)
	{
		try {
			if(rs!=null)rs.close();
			if(s!=null)s.close();
			if(c!=null)c.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public static void closeEx(Connection c,PreparedStatement s,ResultSet rs)
	{
		try {
			if(rs!=null)rs.close();
			if(s!=null)s.close();
			if(c!=null)c.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public static void printResultSet(ResultSet rs)
	{
		
		try {
			while(rs.next())
			{
				int cc=rs.getMetaData().getColumnCount();
				for(int i=1;i<=cc;i++)
				{
					System.out.print(rs.getString(i)+'\t');
				}
				System.out.println();
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public static void printTable(Statement s,String tablename)
	{
		String sql="select * from "+tablename;
		ResultSet rs=null;
		try {
			rs=s.executeQuery(sql);
			printResultSet(rs);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		finally{
			if(rs!=null)
				try {
					rs.close();
				} catch (SQLException e) {
					throw new RuntimeException(e);
				}
		}
		
>>>>>>> 0b7ec55813aa1b2c23f9562e23720c90359be9b7
	}
}
